package com.mobile.dao.grid.base.hibernate;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;

import com.mobile.dao.HibernateSessionFactory;
import com.mobile.dao.IBaseDAO;
import com.mobile.dao.PageImplDAO;
import com.mobile.gridUtil.GridFilter;
/**
 * 获得基本的dao操作类
 * @author hf
 *
 */
public class BaseHibernateDAO extends PageImplDAO implements IBaseDAO{

	
	/**
	 * @return 
	 */
	
	public Session getSession() {
		return HibernateSessionFactory.getSession();
	}
	/**
	 * 获得总数
	 * @param cl				域模型的类
	 * @param gridFilterList	要过滤的列表值
	 * @return 返回整型值
	 */
	public int getTotalSize(Class cl,List<GridFilter> gridFilterList){
		/**
		 * 查询总数，设置总条数
		 */
		DetachedCriteria criteria=createDetachedCriteria(cl,gridFilterList)
							.setProjection(Projections.count("uniqueCode"));
		
		return (Integer)criteria.getExecutableCriteria(getSession()).list().get(0);
	}
	/**
	 * 获得总数
	 * @param pojo				域模型的类
	 * @param gridFilterList	要过滤的列表值
	 * @return 返回整型值
	 */
	public int getTotalSize(Object pojo,List<GridFilter> gridFilterList){
		/**
		 * 查询总数，设置总条数
		 */
		Example example=Example.create(pojo);
		DetachedCriteria criteria=createDetachedCriteria(pojo.getClass(),gridFilterList)
							.add(example)
							.setProjection(Projections.count("uniqueCode"));
		
		return (Integer)criteria.getExecutableCriteria(getSession()).list().get(0);
	}
	/**
	 * 获得分页数据
	 * @param start				开始读取的索引
	 * @param pageSize			总共读取的数目
	 * @param cl				域模型的类
	 * @param gridFilterList	要过滤的列表值
	 * @return					列表
	 */
	public List getPageList(int start,int pageSize,Class cl,List<GridFilter> gridFilterList){
		DetachedCriteria criteria = createDetachedCriteria(cl,gridFilterList)
									.addOrder(Order.asc("uniqueCode"));
		List list=criteria.getExecutableCriteria(getSession())
					.setFirstResult(start)
					.setMaxResults(pageSize)
					.setFetchSize(10)
					.list();
		return list;
	}
	/**
	 * 获得分页数据
	 * @param start				开始读取的索引
	 * @param pageSize			总共读取的数目
	 * @param pojo				域模型的类
	 * @param gridFilterList	要过滤的列表值
	 * @return					列表
	 */
	public List getPageList(int start,int pageSize,Object pojo,List<GridFilter> gridFilterList){
		Example example=Example.create(pojo);
		DetachedCriteria criteria = createDetachedCriteria(pojo.getClass(),gridFilterList)
									.addOrder(Order.asc("uniqueCode"));
		List list=criteria.getExecutableCriteria(getSession())
					.add(example)
					.setFirstResult(start)
					.setMaxResults(pageSize)
					.setFetchSize(10)
					.list();
		return list;
	}
	/**
	 * 获得所有数据
	 * @param cl				域模型的类
	 * @param gridFilterList	要过滤的列表值
	 * @return					列表
	 */
	public List getAllList(Class cl,List<GridFilter> gridFilterList){
		DetachedCriteria criteria = createDetachedCriteria(cl,gridFilterList)
									.addOrder(Order.asc("uniqueCode"));
		List list=criteria.getExecutableCriteria(getSession())
					.list();
		return list;
	}
	/**
	 * 获得所有数据
	 * @param pojo				域模型的类
	 * @param gridFilterList	要过滤的列表值
	 * @return					列表
	 */
	public List getAllList(Object pojo,List<GridFilter> gridFilterList){
		Example example=Example.create(pojo);
		DetachedCriteria criteria = createDetachedCriteria(pojo.getClass(),gridFilterList)
									.addOrder(Order.asc("uniqueCode"));
		List list=criteria.getExecutableCriteria(getSession())
					.add(example)
					.list();
		return list;
	}
	/**
	 * 获得符合pojo条件的数据
	 * @param pojo				域模型的类
	 * @return					列表
	 */
	public List getAllList(Object pojo){
		Example example=Example.create(pojo);
		DetachedCriteria criteria=DetachedCriteria.forClass(pojo.getClass())
									.addOrder(Order.asc("uniqueCode"));
		List list=criteria.getExecutableCriteria(getSession())
					.add(example)
					.list();
		return list;
	}
	/**
	 * 删除多条记录
	 * @param cl			要删除的类的名称
	 * @param ids			要删除的数据的唯一码
	 * 
	 */
	public void deleteById(Class cl,String[] ids){
		for(String id:ids){
			deleteById(cl,id);
		}
	}
	/**
	 * 根据唯一码删除一条记录
	 * @param cl			要删除的类的名称
	 * @param id
	 */
	public void deleteById(Class cl,String id){
		getSession().delete(getSession().get(cl, id));
	}
	/**
	 * 保存数据
	 * @param pojo			保存数据的对象
	 * @return				返回改变的id
	 */
	public Object save(Object pojo){
		return getSession().save(pojo);
	}
	/**
	 * 保存数据
	 * @entity				实体名称
	 * @param pojo			保存数据的对象
	 * @return				返回改变的id
	 */
	public Object save(String entity,Object pojo){
		return getSession().save(entity,pojo);
	}
	/**
	 * 保存或修改数据
	 * @param pojo			保存数据的对象
	 */
	public Object merge(Object pojo){
		return getSession().merge(pojo);
	}
	/**
	 * 修改数据
	 * @param pojo			保存数据的对象
	 */
	public void update(Object pojo){
		getSession().update(pojo);
	}
	/**
	 * 通过唯一标识码来查找对象
	 * @param cl			域对象
	 * @param uniqueCode	唯一标识码
	 * @return
	 */
	public Object findById(Class cl,String uniqueCode){
		return getSession().get(cl, uniqueCode);
	}
}
